package com.example.connectservice;

import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection {
    private EditText etData;
    private MyService.Binder binder;
    private TextView tvOut;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etData = (EditText)findViewById(R.id.etData);
        tvOut = (TextView)findViewById(R.id.tvOut);


        findViewById(R.id.btnStartService).setOnClickListener(this);
        findViewById(R.id.btnStopService).setOnClickListener(this);
        findViewById(R.id.btnBindService).setOnClickListener(this);
        findViewById(R.id.btnUnbindService).setOnClickListener(this);
        findViewById(R.id.btnSyncData).setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {
        if(view.getId()==R.id.btnStartService){
            Intent i = new Intent(MainActivity.this,MyService.class);
            i.putExtra("data",etData.getText().toString());
            startService(i);
        }else if(view.getId()==R.id.btnStopService){
            stopService(new Intent(MainActivity.this,MyService.class));
        }else if(view.getId()==R.id.btnBindService){
            bindService(new Intent(MainActivity.this,MyService.class),this, Context.BIND_AUTO_CREATE);
        }else if(view.getId()==R.id.btnUnbindService){
            unbindService(this);
        }else if(view.getId()==R.id.btnSyncData){
            //同步：执行Service里面的一个方法，用方法来执行修改
            if(binder!=null){
                binder.setData(etData.getText().toString());
            }
        }
    }

    //绑定服务的时候执行的代码
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        //问题1的个人推论：第18行的代码创建了一个关于MyService.Binder中的==引用==，由于public void onServiceConnected(ComponentName componentName, IBinder iBinder)
        //该方法中的IBinder iBinder是访问MyService中复写的 public IBinder onBind(Intent intent)方法，而在该方法中返回的是一个被实例化的Binder对象，因此可以使得binder(引用)
        //指向Binder对象，从而使得binder(引用)能够使用Binder中的方法。
        binder = (MyService.Binder) iBinder;

        //问题3个人推论：因为该章节说的是绑定服务并进行通信，因此要用binder这个引用实例，这是一点；第二点，setCallBack是MyService中的一个方法，而binder只是MyService内部类Binder的引用实例
        //为了能够访问setCallBack这一个方法，所以要在Binder（在MyService中）这一个内部类添加getService这一个方法。
        binder.getService().setCallBack(new MyService.CallBack() {
            @Override

            public void onDataChange(String data) {
                //直接写tvOut.setText(data)?
                //不行，因为这个public void onDataChange(String data)方法是在MyService中创建的线程所调用的
                //直接使用一个新线程来执行UI线程的资源是无法成功的，
                //因为android中有个安全机制：不能直接让其他辅线程来修改UI线程的
//                 作用： 跨线程传递信息或操作
                Message msg = new Message();

                //==================================================================================
                //因为message.setData中要传入的是一个Bundle类型，所以需要创建一个Bundle
                //并使用putString来将信息储存
                Bundle b = new Bundle();
                b.putString("data",data);
                msg.setData(b);
                //==================================================================================
                handler.sendMessage(msg);
            }
        });
    }

//    作用：实现不同线程之间信息的传递以及操作
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //最后通过msg.getData().getString("key")来获取信息
            tvOut.setText(msg.getData().getString("data"));
        }
    };

    @Override
    public void onServiceDisconnected(ComponentName componentName) {

    }
}
